#pragma once
#include <iostream>
#include <string>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

namespace MyDaemon
{
#define NULLFILE "/dev/null"
    // class Daemon
    // {
    // public:
        void Daemon(const std::string &pwd = "")
        {
            
            signal(SIGCLD, SIG_IGN);
            signal(SIGPIPE, SIG_IGN);
            signal(SIGSTOP, SIG_IGN);

            // 创建子进程,将父进程退出,子进程由操作系统领养,形成新的会话
            if (fork())
                exit(0);
            setsid();

            // 更改当前文件的调用路径
            if (!pwd.empty())
                chdir(pwd.c_str());

            // 重定向标准输入,输出,错误
            int fd = open(NULLFILE, O_RDWR);
            if (fd < 0)
            {
                std::cout << "open NULLFILE errno" << std::endl;
                exit(1);
            }
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    //};
}